<?php
    /**
     * 通过url获取数据
     * @param String $url
     * @param String charset 将获取的数据转换成该字符编码
     * @param Number $maxnum 尝试连接的次数
     * @param Array $options curl的option设置
     */

    function data_from_url($url, $options = array(), $charset = 'utf-8', $maxnum = 5)
    {
        include('D:\sofwear\PHPstorm\PhpStorm 2016.2\plugins\php\lib\php.jar!\com\jetbrains\php\lang\psi\stubs\data\fileinfo.php');
        set_time_limit(40);
        $cp = curl_init();
        $opt = array(
            CURLOPT_URL => $url,
            CURLOPT_TIMEOUT => 30,
            CURLOPT_RETURNTRANSFER => true,
            //CURLOPT_ENCODING => 'gzip',

            CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.76 Safari/537.36'
        );

        curl_setopt_array($cp, $opt);
        if ($options) {
            curl_setopt_array($cp, $options);
        }

        $_arr = parse_url($url);
        if (!empty($_arr['scheme']) && $_arr['scheme'] == 'https') {
            curl_setopt($cp, CURLOPT_SSL_VERIFYPEER, false);
        }
        $start_time = date('Y-m-d H:i:s');
        $contents = curl_exec($cp);
        $num = 1;
        while (curl_errno($cp) === 28) {
            if ($num > $maxnum) {
                break;
            }
            $num++;
            $start_time = date('Y-m-d H:i:s');
            $contents = curl_exec($cp);
        }
        $errno = curl_errno($cp);
        $error = curl_error($cp);
        $content_type = curl_getinfo($cp, CURLINFO_CONTENT_TYPE);
        $chear_type = strrchr($content_type, '=');

        $chear_type = trim($chear_type, ' =');
        //file_put_contents('post.txt', date('Y-m-d H:i:s  ') . $url . PHP_EOL . var_export(curl_getinfo($cp),true) . PHP_EOL . PHP_EOL, FILE_APPEND);
        curl_close($cp);
        if (!$error) {
            $fo = finfo_open(FILEINFO_MIME_TYPE);
            if (strtolower(strstr(finfo_buffer($fo, $contents), '/', true)) == 'text') { //如果是文本则进行转码  否则不转码
                if ($charset) {
                    //$chear_type = strtolower(mb_detect_encoding($contents,'gbk,gb2312,ASCII,UCS-2,UCS-2LE,UCS-2BE,'.$charset));
                    if ($chear_type) {
                        if ($chear_type != $charset) {
                            $contents = mb_convert_encoding($contents, $charset, $chear_type);
                            // $contents=thbmsz($contents,$charset);
                            $contents = preg_replace('/charset\=".*?"/', $charset, $contents);
                        }
                    }
                }
            }
        } else {
            $contents = '';
        }
        file_put_contents('test.txt', $start_time . '--' . date('Y-m-d H:i:s  ') . $url . PHP_EOL . $contents . PHP_EOL . PHP_EOL, FILE_APPEND);
        return array('contents' => $contents, 'error' => $error, 'errno' => $errno);
    }

    /**
     * 将请求参数放到url上
     * @param String $url
     * @param String or Array $param 参数
     */
    function set_url_param($url, $param = array())
    {
        $p = '';

        if (is_array($param)) {
            foreach ($param as $k => $v) {
                $p .= "{$k}=" . urlencode($v) . "&";
            }
            $p = trim($p, '&');
        } else if (is_string($param)) {
            $p .= $param;
        }

        $uinfo = parse_url($url);
        $new_url = '';
        !empty($uinfo['scheme']) && $new_url .= $uinfo['scheme'] . '://';
        !empty($uinfo['host']) && $new_url .= $uinfo['host'];
        !empty($uinfo['port']) && $new_url .= ':' . $uinfo['port'];
        !empty($uinfo['path']) && $new_url .= $uinfo['path'];

        $query = '';
        if (!empty($uinfo['query'])) {
            $query .= '?' . $uinfo['query'];
        }
        if ($p) {
            if ($query) {
                $query .= '&' . $p;
            } else {
                $query .= '?' . $p;
            }
        }
        $new_url .= $query;

        !empty($uinfo['fragment']) && $new_url .= '#' . $uinfo['fragment'];
        return $new_url;
    }

    /**
     * 将参数数组 转成 字符串格式  （url传参格式）
     * @param String or Array $param 参数
     */
    function param_to_str($param = array())
    {
        $p = '';
        if (is_array($param)) {
            foreach ($param as $k => $v) {
                $p .= "{$k}=" . urlencode($v) . "&";
            }
            $p = trim($p, '&');
        } else if (is_string($param)) {
            $p .= $param;
        }

        return $p;
    }


    /**
     * get方式 获取数据
     * @param String $url
     * @param $param 字符串 或 数组
     */
    function get_interface($url, $param = array())
    {
        $opt[CURLOPT_HTTPGET] = true;
        $url = set_url_param($url, $param);
        //echo $url;exit;
        return data_from_url($url, $opt);
    }

    /**
     * post方式 获取数据
     * @param String $url
     * @param $param 数组
     */
    function post_interface($url, $param = array())
    {
        $opt[CURLOPT_POST] = true;
        $opt[CURLOPT_POSTFIELDS] = $param;
        return data_from_url($url, $opt);
    }

    /**
     * ajax返回数据
     * @param int $status 状态，1表示成功，0表示失败
     * @param String $info 提示信息
     * @param $data 数据
     */
    function ajax_return($status, $info = '', $data = null)
    {
        echo json_encode(array(
            'status' => $status,
            'info' => $info,
            'data' => $data
        ));
        exit;
    };

    /**
     * 发送手机验证码
     * @param $tel 电话号
     * @param $msg 发送的字符串
     */
    function send_phone_check($tel, $msg)
    {
        $uid = "105771";
        $password = "DZ105771";
        $srcphone = "106910135771";
        $param = array(
            'uid' => $uid,
            'pwd' => md5($password),
            'mobile' => $tel,
            'srcphone' => $srcphone,
            'msg' => $msg
        );
        $send_sms_url = "http://119.23.114.82:6666/cmppweb/sendsms";

        $url = set_url_param($send_sms_url, $param);
        //file_put_contents('aaaaa.txt', $url . PHP_EOL);
        $c = curl_init($url);
        curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
        curl_exec($c);
        if (curl_errno($c)) {
            $res = array(
                'status' => 0,
                'errno' => curl_errno($c),
                'error' => curl_error($c)
            );
        } else {
            $res = array(
                'status' => 1
            );
        }
        curl_close($c);
        return $res;
    }


    /**
     * 验证是否为手机号码
     * @param String $str 要验证的字符串
     * @return boolean
     */
    function check_mobile($str)
    {
        if (!$str) {
            return true;
        }
        if (preg_match("/^1[34578]{1}\d{9}$/", $str)) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 将二维数组转换为一维数组(主要用于select取出的数据)
     * $arr:要处理的二维数组
     * $field1:第二维数组的键值，它的值将作为新数组的值
     * $field2:第二维数组的键值，它的值将作为新数组的键（可选）
     */
    function array_transform($arr, $field1, $field2 = null)
    {
        $newarr = array();
        if (!$field2) {
            foreach ($arr as $v) {
                $newarr[] = $v[$field1];
            }
        } else {
            foreach ($arr as $v) {
                $newarr[$v[$field2]] = $v[$field1];
            }
        }
        return $newarr;
    }

    /**
     * 重新设置数组的键值(主要用于select取出的数据)
     * @param $arr :要处理的二维数组
     * @param $field :第二维数组的键值，它的值将作为第一维数组的键
     */
    function array_reset_key($arr, $field)
    {
        $newarr = array();
        foreach ($arr as $v) {
            $newarr[$v[$field]] = $v;
        }
        return $newarr;
    }

    /**
     * 检查一个变量是否为空，0 不算空
     * @param $str :要处理的二维数组
     */
    function check_empty($str)
    {
        if (is_numeric($str)) {
            return false;
        } else {
            return empty($str);
        }
    }

    /**
     * 解析搜索参数
     * @param String $str 要解析的参数字符串
     * @param Booler $unempty 是否过滤掉空值
     * @return array 返回解析后的参数
     */
    function parse_param($str, $unempty = false)
    {
        $p = array();
        if (!$str) {
            return $p;
        }
        $a = explode('&', $str);
        if (!$a) {
            return $p;
        }
        foreach ($a as $kv) {
            $b = explode('=', $kv);
            if ($b && $b[0]) {
                $k = urldecode($b[0]);
                if (isset($b[1])) {
                    $p[$k] = urldecode($b[1]);
                } else {
                    $p[$k] = null;
                }
                if ($unempty) {
                    if (check_empty($p[$k])) {
                        unset($p[$k]);
                    }
                }
            }
        }
        return $p;
    }

    /**
     * 过滤参数（根据指定过滤）
     * @param array $params 按照 键值 对其进行过滤
     * @param array $parse 允许使用的键值
     * @return array 返回解析后的参数
     */
    function filter_param($params, $parse)
    {
        $res = array();
        foreach ($parse as $k) {
            if (isset($params[$k])) {
                $res[$k] = $params[$k];
            }
        }
        return $res;
    }

    /**
     * 通过加减运算计算日期
     * @param int $num 天数   例如：-1 标书减去 1天   1 表示加上1天
     * @param String $date 操作的日期，默认为当前日期
     * @return String 返回运算后的日期
     */
    function operation_date($num, $date = false)
    {
        if (!$date) {
            $date = date('Y-m-d');
        }
        $nu = $num * 24 * 60 * 60;

        $du = strtotime($date);

        return date('Y-m-d', $du + $nu);
    }

    /**
     * 根据可读时间字符串 格式化指定格式
     * @param int $formation 同date函数的参数
     *
     */
    function format_from_date($formation, $date = null)
    {
        if (!$date) {
            $u = time();
        } else {
            $u = strtotime($date);
        }
        return date($formation, $u);
    }

    /**
     * 将无限分类数据进行等级分组
     * @$arr:要处理的二维数组(select取出的数据)
     * @$parent_field:表示上一级别的字段，例如：表示 父id 的字段
     * @return：返回包涵同等级分类的二维数组
     */
    function grade_group($arr, $parent_field)
    {
        $newarr = array();
        foreach ($arr as $v) {
            if ($v[$parent_field] != '' && $v[$parent_field] != null) {
                if (!isset($newarr[$v[$parent_field]])) {
                    $newarr[$v[$parent_field]] = array();
                }
                array_push($newarr[$v[$parent_field]], $v);
            }
        }
        return $newarr;
    }

    /**
     * 分组统计数据(求和)，可通过多个字段进行分组
     * @$arr:要处理的二维数组(select取出的数据)
     * @$parent_field:表示上一级别的字段，例如：表示 父id 的字段（用于分组的字段），多个字段用逗号分隔 或 一个数组列表
     * @$statistic_field:需要统计的字段，多个字段用逗号分隔 或 一个数组列表
     * @$unfield:需要过滤掉的字段，多个字段用逗号分隔 或 一个数组列表
     * @return：返回处理后的数据列表
     */

    function group_statistic_sum($arr, $parent_field, $statistic_field, $unfield = null)
    {
        $data = array();
        if (is_string($parent_field)) {
            $parent_field = explode(',', $parent_field);
        }

        if (is_string($statistic_field)) {
            $sfield = explode(',', $statistic_field);
        }
        if (is_string($unfield)) {
            $unfield = explode(',', $unfield);
        }

        $fgf = '__';
        foreach ($arr as $v) {
            $pfield = '';
            foreach ($parent_field as $pv) {
                $pfield .= $v[$pv] . $fgf;
            }


            if (!isset($data[$pfield])) {
                $data[$pfield] = array();
            }

            foreach ($v as $k => $v2) {

                if (in_array($k, $sfield)) {
                    $data[$pfield][$k] += $v2;
                } else {

                    if (!check_empty($unfield) && !in_array($k, $unfield)) {
                        $data[$pfield][$k] = $v2;
                    }
                }
            }

        }

        $data = array_values($data);
        return $data;
    }


    /**
     * 解析上传的数据字段
     * @param String
     */
    function pase_file(&$content)
    {
        $content = base64_decode(ltrim(strstr($content, ','), ','));
        if (!$content) {
            return false;
        }
        $finfo = new finfo();
        $mime = $finfo->buffer($content, FILEINFO_MIME_TYPE);
        $mime_encoding = $finfo->buffer($content, FILEINFO_MIME_ENCODING);
        $suffix = get_fix_form_mime($mime);
        $info = array(
            'content' => $content,
            'length' => strlen($content),
            'mime' => $mime,
            'mime_encoding' => $mime_encoding,
            'suffix' => $suffix
        );
        return $info;
    }

    /**
     * 根据mime类型 返回文件后缀
     */
    function get_fix_form_mime($mime)
    {
        switch ($mime) {
            //case 'image\/bmp|image\/cis\-cod|image\/gif|image\/ief|image\/jpeg|image\/jpeg|image\/jpeg|image\/pipeg|image\/png'
            case 'image/gif':
                return '.gif';
                break;

            case 'image/jpeg':
                return '.jpg';
                break;

            case 'image/png':
                return '.png';
                break;
        }
    }

    /**
     * 讲内容写入文件,如果文件目录不存在则自动创建，其他同 file_put_contents 函数
     */
    function file_write($filename, $data, $flags = 0, $context = null)
    {
        $dir = dirname($filename);
        if (!file_exists($dir)) {
            mkdir($dir, 0777, true);
        }
        $res = file_put_contents($filename, $data, $flags, $context);
        return $res;
    }

    /**
     * 解析请求分页参数
     */
    function parse_page_info()
    {
        $page_info = array();
        $page = I('page', 1, 'intval');//第几页
        $rows = I('rows', 20, 'intval');//查询条数
        $offset = ($page - 1) * $rows;

        // $page_info['page'] = $page;
        $page_info['rows'] = $rows;
        $page_info['offset'] = $offset;

        return $page_info;
    }

    /**
     * 将数据写入到 excel 格式文件
     * @param Array $data 要写入的数据
     * @param String $file 保存的文件
     * @param Array $tableheader 表头
     */
    function excel_insert(array $data, $file, $tableheader = array())
    {

//    $data = [
//        '库房'=>[
//            ['库房编号','库房名词',1],
//            ['库房编号','库房名词',1],
//            ['库房编号','库房名词',1],
//            ['库房编号','库房名词',1],
//            ['库房编号','库房名词',1],
//        ],
//        '库房2'=>[
//            ['库房编号','库房名词',1],
//            ['库房编号','库房名词',1],
//            ['库房编号','库房名词',1],
//            ['库房编号','库房名词',1],
//            ['库房编号','库房名词',1],
//        ],
//    ];
//    excel_insert($data,'s.xlsx');

        if (!$data || !$file) {

            return false;
        }

        include_once VENDOR_PATH . 'PHPExcel/PHPExcel.php';

        $sheet_id = 0;
        //创建excel操作对象
        $objPHPExcel = new PHPExcel();
        //获得文件属性对象，给下文提供设置资源
        $objPHPExcel->getProperties()->setCreator("")
            ->setLastModifiedBy("")
            ->setTitle("")
            ->setSubject("")
            ->setDescription("")
            ->setKeywords("")
            ->setCategory("");
        for ($i = 1; $i < count($data); $i++) {
            $objPHPExcel->addSheet(new PHPExcel_Worksheet($objPHPExcel, 'sheet' . $i));
        }
        foreach ($data as $sheetName => $sheetData) {
            $Sheet = $objPHPExcel->setActiveSheetIndex($sheet_id);
            $Sheet->setTitle($sheetName);
            $insert_id = 1;

            if ($tableheader && is_array($tableheader)) {

                //填充表头信息
                for ($i = 0; $i < count($tableheader); $i++) {
                    $Sheet->setCellValue(chr(65 + $i) . $insert_id, $tableheader[$i]);
                }
                $insert_id++;
            }

            foreach ($sheetData as $rowData) {
                if (is_array($rowData) && $rowData) {
                    $j = 0;
                    foreach ($rowData as $id => $cellData) {
                        // if(is_numeric($id)&&(is_string($cellData)||is_numeric($cellData))){
                        //$Sheet->setCellValue(chr(65+$id).$insert_id,$cellData);
                        $Sheet->setCellValue(chr(65 + $j) . $insert_id, $cellData);
                        $j++;
                        //}else{

                        //    return false;

                        // }
                    }
                    $insert_id++;
                } else {
                    return false;
                }
            }
            $sheet_id++;
        }
        try {
            $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
            $objWriter->save($file);
        } catch (Exception $e) {

            return false;
        }
    }

    /*
        下载并删除源文件
        $filePath:提供下载的文件
        $fileName:下载的文件时的保存名称

    */
    function download($filePath, $fileName = '')
    {
        if (!$filePath || !file_exists($filePath) || is_dir($filePath)) {
            return false;
        }
        if (!$fileName) {
            $fileName = time() . mt_rand(0, 10000) . strrchr($filePath);
        }

        $fp = fopen($filePath, "r");
        $file_size = filesize($filePath);
        //下载文件需要用到的头
        Header("Content-type: application/octet-stream");
        Header("Accept-Ranges: bytes");
        Header("Accept-Length:" . $file_size);
        Header("Content-Disposition: attachment; filename=" . $fileName);
        $buffer = 1024;  //设置一次读取的字节数，每读取一次，就输出数据（即返回给浏览器）
        $file_count = 0; //读取的总字节数
        //向浏览器返回数据
        while (!feof($fp) && $file_count < $file_size) {
            $file_con = fread($fp, $buffer);
            $file_count += $buffer;
            echo $file_con;
        }
        fclose($fp);

        //下载完成后删除压缩包，临时文件夹
        if ($file_count >= $file_size) {
            unlink($filePath);
        }
    }

    /*
    * 格式化成jqGrid格式数据
    * $param Array $data:数据列表
    * $param Int $count:数据总数
    * $param Int $rows:显示条数
    * $param Int $page:当前页
    * 返回jqGrid 需要的格式
    */
    function format_jqgrid_data($data = array(), $count = 0, $rows = 0, $page = 1)
    {
        $d['records'] = $count;
        $d['rows'] = $data;
        if (!$rows) {
            $d['total'] = 0;
        } else {
            $d['total'] = ceil($count / $rows);
        }
        $d['page'] = $page;

        return $d;
    }

    /*
    * 输出jqGrid格式的数据
    * $param Array $data:数据列表
    * $param Int $count:数据总数
    * $param Int $rows:显示条数
    * $param Int $page:当前页
    * 返回jqGrid 需要的格式的json数据
    */
    function ajax_return_jqgrid($data = array(), $count = 0, $rows = 0, $page = 1)
    {
        $d = format_jqgrid_data($data, $count, $rows, $page);
        echo json_encode($d);
        exit;
    }


    /**
     * 格式化时间，输出订单号
     */
    function time_to_order()
    {
        return date("YmdHis");
    }
?>